package com.example.day3.stream;

import java.util.StringJoiner;
import java.util.stream.Stream;


/**
 * 收集
 */
public class C11CollectTest {
    /*
        收集：将元素收集入容器
            .collect(() -> c, (c, x) -> void, ?)
            () -> c             创建容器 c
            (c, x) -> void      将元素 x 加入 容器 c
     */
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("令狐冲", "风清扬", "独孤求败", "方证",
                "东方不败", "冲虚", "向问天", "任我行", "不戒", "不戒", "不戒", "不戒");
        // 1.把流中的数据收集到List中
        // List<String> result = stream.collect(() -> new ArrayList<>(), (list, x) -> list.add(x), (a, b) -> {});
        // 使用方法引用简化
        // ArrayList::new  () -> new ArrayList()
        // ArrayList::add  (list,x) -> list.add(x)
        // List<String> result = stream.collect(ArrayList::new, ArrayList::add, (a, b) -> {});

        // 2.把流中的数据收集到Set中
        // Set<String> result = stream.collect(LinkedHashSet::new, LinkedHashSet::add, (a, b) -> {});
        // result.forEach(System.out::println);

        // 3.把流中的数据收集到Map中
        // Map<String, Integer> result = stream.collect(HashMap::new, (map, t) -> map.put(t, 1), (a, b) -> {});
        // result.forEach((k, v) -> System.out.println(k + ":" + v));

        // 4.把流中的数据收集到StringBuilder中
        // StringBuilder sb = stream.collect(StringBuilder::new, StringBuilder::append, (a, b) -> {});
        // System.out.println(sb);

        // 5.把流中的数据收集到StringJoiner中
        // 因为StringJoiner没有无参构造所以不能使用方法引用
        StringJoiner sj = stream.collect(() -> new StringJoiner(","), StringJoiner::add, (a, b) -> {});
        System.out.println(sj);
    }

    record Hero(String name, int strength) {

    }
}
